// go语言接口 - Go 语言提供了另外一种数据类型即接口，它把所有的具有共性的方法定义在一起，任何其他类型只要实现了这些方法就是实现了这个接口。
package main

import "fmt"

/*
 定义接口
type interface_name interface {
	method_name1 [return_type]
	method_name2 [return_type]
	method_name3 [return_type]
	...
	method_namen [return_type]
 }

 定义结构体
 type struct_name struct {
	variables
 }

 实现接口方法
 func (struct_name_variable struct_name) method_name1() [return_type] {
	方法实现
 }
 func (struct_name_variable struct_name) method_namen() [return_type] {
	方法实现
 }
*/

/**
 * 样例1
 */
type Phone interface {
	call()
}
type NokiaPhone struct {
}

func (nokiaPhone NokiaPhone) call() {
	fmt.Println("I am Nokia, I can call you!")
}

type IPhone struct {
}

func (iPhone IPhone) call() {
	fmt.Println("I am iPhone, I can call you!")
}
func t1() {
	var phone Phone
	phone = new(NokiaPhone)
	phone.call()

	phone = new(IPhone)
	phone.call()
}

/**
 * 样例2
 */
type Shape interface {
	area() float64
}
type Rectangle struct {
	width  float64
	height float64
}

func (r Rectangle) area() float64 {
	return r.width * r.height
}

type Circle struct {
	radius float64
}

func (c Circle) area() float64 {
	return 3.14 * c.radius * c.radius
}
func t2() {
	var s Shape

	s = Rectangle{width: 10, height: 5}
	fmt.Printf("矩形面积：%f\n", s.area())

	s = Circle{radius: 3.0}
	fmt.Printf("圆形面积：%f\n", s.area())
}

func main() {
	t1()
	t2()
}
